package com.sky.service;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;

public class WeLinkService {
//package com.example.welinkservice.api.impl;
//
//import com.example.welinkservice.api.WeLinkApiClient;
//import com.example.welinkservice.model.dto.WeLinkApiResponse;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import okhttp3.*;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Service;
//
//import java.io.IOException;
//import java.util.Arrays;
//import java.util.List;
//
//    // 标记为 Spring 服务类，实现 WeLinkApiClient 接口
//    @Service
//    public class WeLinkApiClientImpl implements WeLinkApiClient {
//
//        // 从配置文件中注入 WeLink API 的全量数据 URL
//        @Value("${welink.api.all_url}")
//        private String allApiUrl;
//        // 从配置文件中注入 WeLink API 的增量数据 URL
//        @Value("${welink.api.incremental_url}")
//        private String incrementalApiUrl;
//        // 从配置文件中注入 client_id
//        @Value("${welink.api.client_id}")
//        private String clientId;
//        // 从配置文件中注入 client_secret
//        @Value("${welink.api.client_secret}")
//        private String clientSecret;
//
//        // 创建 OkHttpClient 实例，用于发送 HTTP 请求
//        private final OkHttpClient client = new OkHttpClient();
//        // 创建 ObjectMapper 实例，用于 JSON 数据的处理
//        private final ObjectMapper objectMapper = new ObjectMapper();
//
//        @Override
//        public List<WeLinkApiResponse> getAllMeetingUsage() throws IOException {
//            // 构建全量数据请求 URL，添加查询参数
//            HttpUrl httpUrl = HttpUrl.parse(allApiUrl)
//                    .newBuilder()
//                    .addQueryParameter("client_id", clientId)
//                    .addQueryParameter("client_secret", clientSecret)
//                    .build();
//
//            // 构建 HTTP 请求，设置请求 URL 和请求方法为 GET
//            Request request = new Request.Builder()
//                    .url(httpUrl)
//                    .build();
//
//            // 发送请求并处理响应
//            try (Response response = client.newCall(request).execute()) {
//                // 检查响应是否成功且响应体不为空
//                if (response.isSuccessful() && response.body() != null) {
//                    // 获取响应体的字符串内容
//                    String responseData = response.body().string();
//                    // 将响应数据转换为 WeLinkApiResponse 列表
//                    return Arrays.asList(objectMapper.readValue(responseData, WeLinkApiResponse[].class));
//                }
//            }
//            // 如果请求失败或响应无效，返回空列表
//            return List.of();
//        }
//
//        @Override
//        public List<WeLinkApiResponse> getIncrementalMeetingUsage(String startTime, String endTime) throws IOException {
//            // 构建增量数据请求 URL，添加查询参数
//            HttpUrl httpUrl = HttpUrl.parse(incrementalApiUrl)
//                    .newBuilder()
//                    .addQueryParameter("client_id", clientId)
//                    .addQueryParameter("client_secret", clientSecret)
//                    .addQueryParameter("startTime", startTime)
//                    .addQueryParameter("endTime", endTime)
//                    .build();
//
//            // 构建 HTTP 请求，设置请求 URL 和请求方法为 GET
//            Request request = new Request.Builder()
//                    .url(httpUrl)
//                    .build();
//
//            // 发送请求并处理响应
//            try (Response response = client.newCall(request).execute()) {
//                // 检查响应是否成功且响应体不为空
//                if (response.isSuccessful() && response.body() != null) {
//                    // 获取响应体的字符串内容
//                    String responseData = response.body().string();
//                    // 将响应数据转换为 WeLinkApiResponse 列表
//                    return Arrays.asList(objectMapper.readValue(responseData, WeLinkApiResponse[].class));
//                }
//            }
//            // 如果请求失败或响应无效，返回空列表
//            return List.of();
//        }
//    }

//package com.example.welinkservice.api;
//
//import com.example.welinkservice.model.dto.WeLinkApiResponse;
//
//import java.io.IOException;
//import java.util.List;
//
//    // 定义 WeLink API 客户端接口
//    public interface WeLinkApiClient {
//        // 定义获取全量会议使用数据的方法，可能会抛出 IOException 异常
//        List<WeLinkApiResponse> getAllMeetingUsage() throws IOException;
//        // 定义获取增量会议使用数据的方法，根据开始时间和结束时间筛选，可能会抛出 IOException 异常
//        List<WeLinkApiResponse> getIncrementalMeetingUsage(String startTime, String endTime) throws IOException;
//    }

//package com.example.welinkservice.controller;
//
//import com.example.welinkservice.service.WeLinkService;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//
//import java.io.IOException;
//
//    // 标记为 Spring REST 控制器类，处理 HTTP 请求
//    @RestController
//// 定义请求映射路径
//    @RequestMapping("/welink")
//    public class WeLinkController {
//
//        // 自动注入 WeLinkService 实例，处理业务逻辑
//        @Autowired
//        private WeLinkService weLinkService;
//
//        // 定义 GET 请求处理方法，调用服务层的方法获取全量会议使用数据并保存
//        @GetMapping("/getAllAndSaveMeetingUsage")
//        public String getAllAndSaveMeetingUsage() {
//            try {
//                weLinkService.getAllAndSaveMeetingUsage();
//                return "All meeting usage data saved successfully.";
//            } catch (IOException e) {
//                return "Failed to get and save all meeting usage data: " + e.getMessage();
//            }
//        }
//
//        // 定义 GET 请求处理方法，调用服务层的方法获取增量会议使用数据并保存
//        @GetMapping("/getIncrementalAndSaveMeetingUsage")
//        public String getIncrementalAndSaveMeetingUsage(String startTime, String endTime) {
//            try {
//                weLinkService.getIncrementalAndSaveMeetingUsage(startTime, endTime);
//                return "Incremental meeting usage data saved successfully.";
//            } catch (IOException e) {
//                return "Failed to get and save incremental meeting usage data: " + e.getMessage();
//            }
//        }
//    }

//package com.example.welinkservice.model.dto;
//
//import com.fasterxml.jackson.annotation.JsonProperty;
//import lombok.Data;
//
//    // 使用 Lombok 注解自动生成 getter、setter、toString 等方法
//    @Data
//    public class WeLinkApiResponse {
//        // 使用 @JsonProperty 注解指定 JSON 字段名与类属性名的映射
//        @JsonProperty("statisticTime")
//        private String statisticTime;
//        @JsonProperty("meetingCount")
//        private int meetingCount;
//        @JsonProperty("attendance")
//        private int attendance;
//        @JsonProperty("meetTime")
//        private int meetTime;
//        @JsonProperty("meetPeopleNumber")
//        private int meetPeopleNumber;
//        @JsonProperty("concurrencyMax")
//        private int concurrencyMax;
//    }

//package com.example.welinkservice.model.entity;
//
//import lombok.Data;
//
//import javax.persistence.Entity;
//import javax.persistence.GeneratedValue;
//import javax.persistence.GenerationType;
//import javax.persistence.Id;
//import java.util.Date;
//
//    // 标记为 JPA 实体类，对应数据库中的表
//    @Entity
//// 使用 Lombok 注解自动生成 getter、setter、toString 等方法
//    @Data
//    public class WeLinkData {
//        // 标记为主键，使用自增策略生成主键值
//        @Id
//        @GeneratedValue(strategy = GenerationType.IDENTITY)
//        private Long id;
//        // 存储从 WeLink API 获取的统计时间
//        private String statisticTime;
//        // 存储从 WeLink API 获取的会议场次
//        private int meetingCount;
//        // 存储从 WeLink API 获取的与会人数
//        private int attendance;
//        // 存储从 WeLink API 获取的会议时长
//        private int meetTime;
//        // 存储从 WeLink API 获取的与会人次
//        private int meetPeopleNumber;
//        // 存储从 WeLink API 获取的最大并发数
//        private int concurrencyMax;
//        // 记录数据的创建时间，用于区分增量数据
//        private Date createTime;
//    }

//package com.example.welinkservice.repository.impl;
//
//import com.example.welinkservice.model.entity.WeLinkData;
//import com.example.welinkservice.repository.WeLinkDataRepository;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.jdbc.core.BeanPropertyRowMapper;
//import org.springframework.jdbc.core.JdbcTemplate;
//import org.springframework.stereotype.Repository;
//
//import java.util.List;
//
//    // 标记为 Spring 数据仓库类，实现 WeLinkDataRepository 接口
//    @Repository
//    public class WeLinkDataRepositoryImpl implements WeLinkDataRepository {
//
//        // 自动注入 JdbcTemplate 实例，用于执行 SQL 语句
//        @Autowired
//        private JdbcTemplate jdbcTemplate;
//
//        @Override
//        public void saveAll(List<WeLinkData> weLinkDataList) {
//            for (WeLinkData weLinkData : weLinkDataList) {
//                // 定义插入数据的 SQL 语句
//                String sql = "INSERT INTO welink_data (statisticTime, meetingCount, attendance, meetTime, meetPeopleNumber, concurrencyMax, createTime) VALUES (?,?,?,?,?,?,?)";
//                // 执行 SQL 语句，插入数据
//                jdbcTemplate.update(sql, weLinkData.getStatisticTime(), weLinkData.getMeetingCount(), weLinkData.getAttendance(),
//                        weLinkData.getMeetTime(), weLinkData.getMeetPeopleNumber(), weLinkData.getConcurrencyMax(), weLinkData.getCreateTime());
//            }
//        }
//
//        @Override
//        public String getLastCreateTime() {
//            // 定义查询最后一条数据创建时间的 SQL 语句
//            String sql = "SELECT createTime FROM welink_data ORDER BY createTime DESC LIMIT 1";
//            // 执行 SQL 语句，获取结果
//            List<String> result = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(String.class));
//            if (!result.isEmpty()) {
//                return result.get(0);
//            }
//            return null;
//        }
//    }

//package com.example.welinkservice.repository;
//
//import com.example.welinkservice.model.entity.WeLinkData;
//
//import java.util.List;
//
//    // 定义 WeLink 数据仓库接口，用于与数据库交互
//    public interface WeLinkDataRepository {
//        // 定义保存 WeLink 数据列表的方法
//        void saveAll(List<WeLinkData> weLinkDataList);
//        // 定义获取最后一条数据的创建时间的方法
//        String getLastCreateTime();
//    }

//package com.example.welinkservice.scheduler;
//
//import com.example.welinkservice.repository.WeLinkDataRepository;
//import com.example.welinkservice.service.WeLinkService;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Component;
//
//import java.io.IOException;
//import java.text.SimpleDateFormat;
//import java.util.Calendar;
//import java.util.Date;
//
//    // 标记为 Spring 组件类，用于定时任务调度
//    @Component
//    public class WeLinkDataScheduler {
//
//        // 自动注入 WeLinkService 实例，处理业务逻辑
//        @Autowired
//        private WeLinkService weLinkService;
//        // 自动注入 WeLinkDataRepository 实例，用于获取最后一条数据的创建时间
//        @Autowired
//        private WeLinkDataRepository weLinkDataRepository;
//
//        // 每天凌晨 2 点执行定时任务，获取增量数据
//        @Scheduled(cron = "0 0 2 * * ?")
//        public void getIncrementalDataDaily() {
//            try {
//                // 获取最后一条数据的创建时间
//                String lastCreateTime = weLinkDataRepository.getLastCreateTime();
//                if (lastCreateTime == null) {
//                    // 如果没有历史数据，不执行增量数据获取
//                    return;
//                }
//                // 获取当前时间
//                Date now = new Date();
//                // 格式化时间
//                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//                String startTime = lastCreateTime;
//                String endTime = sdf.format(now);
//                // 调用服务层的方法获取增量会议使用数据并保存
//                weLinkService.getIncrementalAndSaveMeetingUsage(startTime, endTime);
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
//    }

//package com.example.welinkservice.service.impl;
//
//import com.example.welinkservice.api.WeLinkApiClient;
//import com.example.welinkservice.model.dto.WeLinkApiResponse;
//import com.example.welinkservice.model.entity.WeLinkData;
//import com.example.welinkservice.repository.WeLinkDataRepository;
//import com.example.welinkservice.service.WeLinkService;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import java.io.IOException;
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.List;
//
//    // 标记为 Spring 服务类，实现 WeLinkService 接口
//    @Service
//    public class WeLinkServiceImpl implements WeLinkService {
//
//        // 自动注入 WeLinkApiClient 实例，用于调用 WeLink API
//        @Autowired
//        private WeLinkApiClient weLinkApiClient;
//        // 自动注入 WeLinkDataRepository 实例，用于数据持久化
//        @Autowired
//        private WeLinkDataRepository weLinkDataRepository;
//
//        @Override
//        public void getAllAndSaveMeetingUsage() throws IOException {
//            // 调用 WeLink API 获取全量会议使用数据
//            List<WeLinkApiResponse> apiResponses = weLinkApiClient.getAllMeetingUsage();
//            List<WeLinkData> weLinkDataList = new ArrayList<>();
//            for (WeLinkApiResponse apiResponse : apiResponses) {
//                // 创建 WeLinkData 实体对象，将 API 响应数据转换为实体数据
//                WeLinkData weLinkData = new WeLinkData();
//                weLinkData.setStatisticTime(apiResponse.getStatisticTime());
//                weLinkData.setMeetingCount(apiResponse.getMeetingCount());
//                weLinkData.setAttendance(apiResponse.getAttendance());
//                weLinkData.setMeetTime(apiResponse.getMeetTime());
//                weLinkData.setMeetPeopleNumber(apiResponse.getMeetPeopleNumber());
//                weLinkData.setConcurrencyMax(apiResponse.getConcurrencyMax());
//                weLinkData.setCreateTime(new Date());
//                weLinkDataList.add(weLinkData);
//            }
//            // 调用数据仓库的保存方法，将数据保存到数据库
//            weLinkDataRepository.saveAll(weLinkDataList);
//        }
//
//        @Override
//        public void getIncrementalAndSaveMeetingUsage(String startTime, String endTime) throws IOException {
//            // 调用 WeLink API 获取增量会议使用数据
//            List<WeLinkApiResponse> apiResponses = weLinkApiClient.getIncrementalMeetingUsage(startTime, endTime);
//            List<WeLinkData> weLinkDataList = new ArrayList<>();
//            for (WeLinkApiResponse apiResponse : apiResponses) {
//                // 创建 WeLinkData 实体对象，将 API 响应数据转换为实体数据
//                WeLinkData weLinkData = new WeLinkData();
//                weLinkData.setStatisticTime(apiResponse.getStatisticTime());
//                weLinkData.setMeetingCount(apiResponse.getMeetingCount());
//                weLinkData.setAttendance(apiResponse.getAttendance());
//                weLinkData.setMeetTime(apiResponse.getMeetTime());
//                weLinkData.setMeetPeopleNumber(apiResponse.getMeetPeopleNumber());
//                weLinkData.setConcurrencyMax(apiResponse.getConcurrencyMax());
//                weLinkData.setCreateTime(new Date());
//                weLinkDataList.add(weLinkData);
//            }
//            // 调用数据仓库的保存方法，将数据保存到数据库
//            weLinkDataRepository.saveAll(weLinkDataList);
//        }
//    }

//package com.example.welinkservice.service;
//
//import com.example.welinkservice.model.entity.WeLinkData;
//
//import java.io.IOException;
//import java.util.List;
//
//    // 定义 WeLink 服务接口，处理业务逻辑
//    public interface WeLinkService {
//        // 定义获取全量会议使用数据并保存的方法，可能会抛出 IOException 异常
//        void getAllAndSaveMeetingUsage() throws IOException;
//        // 定义获取增量会议使用数据并保存的方法，根据开始时间和结束时间筛选，可能会抛出 IOException 异常
//        void getIncrementalAndSaveMeetingUsage(String startTime, String endTime) throws IOException;
//    }

//# 数据库连接配置
//    spring.datasource.url=jdbc:mysql://localhost:3306/welink_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
//    spring.datasource.username=root
//    spring.datasource.password=123456
//    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
//
//# WeLink API 配置
//    welink.api.all_url=https://api.welink.com/meeting/all_usage
//    welink.api.incremental_url=https://api.welink.com/meeting/incremental_usage
//    welink.api.client_id=your_client_id
//    welink.api.client_secret=your_client_secret
//
//# 开启定时任务
//    spring.task.scheduling.enabled=true

}
